import os
import glob
import re
from datetime import datetime
from src.core.logging_utils import logger_cust


def extract_retention_days(days_string):
    """
        从给定的字符串中提取表示天数的数字。

        参数:
        days_string (str): 包含天数信息的字符串，例如 "5 days" 或 "10"。

        返回:
        int: 提取出的天数，如果无法提取则返回 0。
    """

    # 使用正则表达式匹配数字
    days = 0
    # 使用正则表达式匹配所有的数字
    days_list = re.findall(r'\d+', days_string)
    if len(days_list) > 0:
        days = days_list[0]
    # 将匹配到的数字字符串转换为整数列表
    return int(days)


def is_older_than_days(file_path, days):
    """
    判断文件是否超过了指定的天数。

    参数:
        file_path (str): 文件的路径。
        days (int): 指定的天数。

    返回:
        bool: 如果文件的修改时间超过了指定的天数，则返回True；否则返回False。
    """
    file_mtime = datetime.fromtimestamp(os.path.getmtime(file_path))
    now = datetime.now()
    delta = now - file_mtime
    delflag = False
    if delta.days >= days:
        delflag = True

    return delflag


def delete_old_files(path, prefix, extension, days_old):
    """
        删除指定路径下满足特定条件的旧文件。

        参数:
        path (str): 文件所在的目录路径。
        prefix (str): 文件名的前缀。
        extension (str): 文件的扩展名。
        days_old (str): 表示文件修改时间超过的天数的字符串，例如 "5 days" 或 "10"。

        函数执行以下操作:
        1. 从 `days_old` 字符串中提取出天数。
        2. 构造文件搜索模式，查找符合前缀和扩展名的文件。
        3. 对于每个找到的文件，如果它存在并且修改时间超过提取出的天数，就尝试删除它。
        4. 在删除文件时，如果成功会打印删除信息并记录日志；如果失败会打印错误信息并记录日志。
    """
    # 构造文件搜索模式
    pattern = os.path.join(path, f"{prefix}*{extension}")
    days = extract_retention_days(days_old)
    if days == 0:
        return
    # 查找所有匹配的文件
    for filename in glob.glob(pattern):
        if is_older_than_days(filename, days):
            if os.path.exists(filename):
                try:
                    os.remove(filename)
                    print(f"Deleted file: {filename}")
                    # logger_utils.logs('error', f"file_utils.delete_old_files-Deleted file: {filename} .")

                except OSError as e:
                    print(f"Error deleting {filename}: {e}")
                    logger_cust.error( f"file_utils.delete_old_files-Error deleting {filename}: {e} .")



def get_file_details(file_path):
    """
    从给定的文件路径中提取文件的详细信息。

    参数:
    file_path (str): 文件的完整路径。

    返回:
    tuple: 包含文件名、文件名（不带扩展名）、文件扩展名（不带点）和文件路径（不包含文件名）的元组。
    """
    file_name = os.path.basename(file_path)  # 提取文件名
    file_name_without_ext, file_extension = os.path.splitext(file_name)  # 提取文件名（不带扩展名） # 提取文件扩展名（不带点）
    file_path_dir = os.path.dirname(file_path)  # 提取文件路径（不包含文件名）
    return file_name, file_name_without_ext, file_extension[1:], file_path_dir


def save_text(base_file_path, text_content, overwrite=True):
    """
    将文本内容保存到指定的文件路径。

    参数:
    file_path (str): 要保存的文件路径（包括文件名和扩展名）。
    text_content (str): 要写入文件的文本内容。
    overwrite (bool, optional): 如果文件已存在，是否覆盖它。默认为False。

    返回:
    None
    """
    file_path = base_file_path
    if not overwrite:
        # 获取文件的基本名称和扩展名
        base_name, ext = os.path.splitext(base_file_path)
        file_number = 1

        # 循环直到找到一个不存在的文件名
        while True:
            # 构造完整的文件名（包括路径、基本名称、序号和扩展名）
            file_path = f"{base_name}_{file_number}{ext}"

            # 检查文件是否存在
            if not os.path.exists(file_path):
                break

                # 如果文件已存在，增加序号
            file_number += 1

    try:
        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(text_content)
        return None
        # print(f"文本已成功保存到 {file_path}")
    except IOError as e:
        return f"无法保存文件: {e}"
        #print(f"无法保存文件: {e}")


if __name__ == '__main__':
    days = extract_retention_days("14 days")
    root_path = '../../logs/'
    file_prefix = 'debug'
    file_extension = '.log'
    days_threshold = "7 days"

    delete_old_files(root_path, file_prefix, file_extension, days_threshold)
